const { Controller } = require('egg');
const { ctxBodyFormatter } = require('../util/formatter');
const ERROR_CODE = require('../errorCode');

class LoginController extends Controller {
  async login() {
    try {
      const { ctx, app } = this;
      // 获取登录时的 username, password
      const { tId, password } = ctx.request.body;
      // 根据用户名，在数据库查找相对应的id操作
      let teacherInfo = await ctx.service.teacher.getTeacher({ tId });
      console.log("🚀 ~ file: login.js ~ line 11 ~ LoginController ~ login ~ teacherInfo", teacherInfo)
      // 1、没找到说明没有该用户
      if (!teacherInfo || !teacherInfo.tId) {
        const res = ctxBodyFormatter(ERROR_CODE.ACCOUNT_NOT_EXIST);
        ctx.status = res.status;
        ctx.body = res.body;
        return;
      }
      // 2、找到用户，并且判断输入密码与数据库中用户密码
      if (teacherInfo && password != teacherInfo.password) {
        const res = ctxBodyFormatter(ERROR_CODE.PASSWORD_ERROR);
        ctx.status = res.status;
        ctx.body = res.body;
        return;
      }
      teacherInfo.password = undefined;
      const token = app.jwt.sign({
        ...teacherInfo,
        exp: Math.floor(Date.now() / 1000) + (24 * 60 * 60) // token 有效期为 24 小时
      }, app.config.jwt.secret);
      // 返回 token
      const res = ctxBodyFormatter({ token, teacherInfo });
      ctx.status = res.status;
      ctx.body = res.body;
    } catch (error) {
      const res = ctxBodyFormatter(ERROR_CODE.LOGIN_FAILED);
      ctx.status = res.status;
      ctx.body = res.body;
    }
  }

  async logout() {
    const { ctx, app } = this;
    const token = app.jwt.sign({
      exp: 0
    }, app.config.jwt.secret);
    const res = ctxBodyFormatter({ token });
    ctx.status = res.status;
    ctx.body = res.body;
  }

  // 测试 解析 token
  async getTokenInfo() {
    const { ctx, app } = this;
    // 1. 获取请求头 authorization 属性，值为 token
    // token 的格式为 Bearer {{token2}}，但得去掉 Bearer
    const token = ctx.request.header.authorization.split(' ')[1];
    // 2. 用 app.jwt.verify(token， app.config.jwt.secret)，解析出 token 的值
    const decode = (await app.jwt.verify(token, app.config.jwt.secret)).dataValues;
    // 返回 token
    ctx.body = {
      code: 1,
      data: { ...decode }
    };
  }
}

module.exports = LoginController;
